{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd \n",
    "import numpy as np\n",
    "#超参数调优\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>pregnants</th>\n",
       "      <th>Plasma_glucose_concentration</th>\n",
       "      <th>blood_pressure</th>\n",
       "      <th>Triceps_skin_fold_thickness</th>\n",
       "      <th>serum_insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>Diabetes_pedigree_function</th>\n",
       "      <th>Age</th>\n",
       "      <th>Triceps_skin_fold_thickness_Missing</th>\n",
       "      <th>serum_insulin_Missing</th>\n",
       "      <th>Target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>0.639947</td>\n",
       "      <td>0.866045</td>\n",
       "      <td>-0.159812</td>\n",
       "      <td>-0.490267</td>\n",
       "      <td>-0.226990</td>\n",
       "      <td>-0.005617</td>\n",
       "      <td>0.468492</td>\n",
       "      <td>1.425995</td>\n",
       "      <td>-0.647760</td>\n",
       "      <td>1.026390</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>-0.844885</td>\n",
       "      <td>-1.205066</td>\n",
       "      <td>-0.553197</td>\n",
       "      <td>-0.636480</td>\n",
       "      <td>-0.226990</td>\n",
       "      <td>-0.580796</td>\n",
       "      <td>-0.365061</td>\n",
       "      <td>-0.190672</td>\n",
       "      <td>-0.647760</td>\n",
       "      <td>1.026390</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>1.233880</td>\n",
       "      <td>2.016662</td>\n",
       "      <td>-0.684325</td>\n",
       "      <td>1.507988</td>\n",
       "      <td>-0.226990</td>\n",
       "      <td>-0.851951</td>\n",
       "      <td>0.604397</td>\n",
       "      <td>-0.105584</td>\n",
       "      <td>1.543781</td>\n",
       "      <td>1.026390</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>-0.844885</td>\n",
       "      <td>-1.073567</td>\n",
       "      <td>-0.553197</td>\n",
       "      <td>-0.782694</td>\n",
       "      <td>-0.490985</td>\n",
       "      <td>-0.457543</td>\n",
       "      <td>-0.920763</td>\n",
       "      <td>-1.041549</td>\n",
       "      <td>-0.647760</td>\n",
       "      <td>-0.974289</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>-1.141852</td>\n",
       "      <td>0.504422</td>\n",
       "      <td>-2.257862</td>\n",
       "      <td>-0.490267</td>\n",
       "      <td>0.358389</td>\n",
       "      <td>0.774983</td>\n",
       "      <td>5.484909</td>\n",
       "      <td>-0.020496</td>\n",
       "      <td>-0.647760</td>\n",
       "      <td>-0.974289</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>5</td>\n",
       "      <td>0.342981</td>\n",
       "      <td>-0.185948</td>\n",
       "      <td>-0.028684</td>\n",
       "      <td>1.507988</td>\n",
       "      <td>-0.226990</td>\n",
       "      <td>-0.662964</td>\n",
       "      <td>-0.818079</td>\n",
       "      <td>-0.275760</td>\n",
       "      <td>1.543781</td>\n",
       "      <td>1.026390</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>6</td>\n",
       "      <td>-0.250952</td>\n",
       "      <td>-1.435189</td>\n",
       "      <td>-1.602221</td>\n",
       "      <td>-0.563374</td>\n",
       "      <td>-0.559853</td>\n",
       "      <td>-0.219255</td>\n",
       "      <td>-0.676133</td>\n",
       "      <td>-0.616111</td>\n",
       "      <td>-0.647760</td>\n",
       "      <td>-0.974289</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>7</td>\n",
       "      <td>1.827813</td>\n",
       "      <td>-0.218823</td>\n",
       "      <td>2.790570</td>\n",
       "      <td>1.507988</td>\n",
       "      <td>-0.226990</td>\n",
       "      <td>0.134069</td>\n",
       "      <td>-1.020427</td>\n",
       "      <td>-0.360847</td>\n",
       "      <td>1.543781</td>\n",
       "      <td>1.026390</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   pregnants  Plasma_glucose_concentration  blood_pressure  \\\n",
       "0   0.639947                      0.866045       -0.159812   \n",
       "1  -0.844885                     -1.205066       -0.553197   \n",
       "2   1.233880                      2.016662       -0.684325   \n",
       "3  -0.844885                     -1.073567       -0.553197   \n",
       "4  -1.141852                      0.504422       -2.257862   \n",
       "5   0.342981                     -0.185948       -0.028684   \n",
       "6  -0.250952                     -1.435189       -1.602221   \n",
       "7   1.827813                     -0.218823        2.790570   \n",
       "\n",
       "   Triceps_skin_fold_thickness  serum_insulin       BMI  \\\n",
       "0                    -0.490267      -0.226990 -0.005617   \n",
       "1                    -0.636480      -0.226990 -0.580796   \n",
       "2                     1.507988      -0.226990 -0.851951   \n",
       "3                    -0.782694      -0.490985 -0.457543   \n",
       "4                    -0.490267       0.358389  0.774983   \n",
       "5                     1.507988      -0.226990 -0.662964   \n",
       "6                    -0.563374      -0.559853 -0.219255   \n",
       "7                     1.507988      -0.226990  0.134069   \n",
       "\n",
       "   Diabetes_pedigree_function       Age  Triceps_skin_fold_thickness_Missing  \\\n",
       "0                    0.468492  1.425995                            -0.647760   \n",
       "1                   -0.365061 -0.190672                            -0.647760   \n",
       "2                    0.604397 -0.105584                             1.543781   \n",
       "3                   -0.920763 -1.041549                            -0.647760   \n",
       "4                    5.484909 -0.020496                            -0.647760   \n",
       "5                   -0.818079 -0.275760                             1.543781   \n",
       "6                   -0.676133 -0.616111                            -0.647760   \n",
       "7                   -1.020427 -0.360847                             1.543781   \n",
       "\n",
       "   serum_insulin_Missing  Target  \n",
       "0               1.026390       1  \n",
       "1               1.026390       0  \n",
       "2               1.026390       1  \n",
       "3              -0.974289       0  \n",
       "4              -0.974289       1  \n",
       "5               1.026390       0  \n",
       "6              -0.974289       1  \n",
       "7               1.026390       0  "
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train = pd.read_csv('pima-indians-tezheng+yuchuli.csv')\n",
    "train.head(8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train = train['Target']\n",
    "X_train = train.drop('Target',axis=1)\n",
    "feat_names = X_train.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score=nan,\n",
       "             estimator=LogisticRegression(C=1.0, class_weight=None, dual=False,\n",
       "                                          fit_intercept=True,\n",
       "                                          intercept_scaling=1, l1_ratio=None,\n",
       "                                          max_iter=100, multi_class='auto',\n",
       "                                          n_jobs=None, penalty='l2',\n",
       "                                          random_state=None, solver='liblinear',\n",
       "                                          tol=0.0001, verbose=0,\n",
       "                                          warm_start=False),\n",
       "             iid='deprecated', n_jobs=None,\n",
       "             param_grid={'C': [0.001, 0.1, 1, 10, 100, 1000],\n",
       "                         'penalty': ['l1', 'l2']},\n",
       "             pre_dispatch='2*n_jobs', refit=True, return_train_score=True,\n",
       "             scoring='neg_log_loss', verbose=0)"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#采用5折交叉验证，分别用log似然损失和正确率，对Logistic回归模型的正则超参数调优。\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "penaltys = ['l1','l2']\n",
    "Cs = [0.001,0.1,1,10,100,1000]\n",
    "parameters = dict(penalty = penaltys,C = Cs)\n",
    "lr_penalty = LogisticRegression(solver = 'liblinear')\n",
    "grid = GridSearchCV(lr_penalty,parameters,cv=5,scoring='neg_log_loss',return_train_score=True)\n",
    "grid.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.4901157580013947\n",
      "{'C': 10, 'penalty': 'l1'}\n"
     ]
    }
   ],
   "source": [
    "print(-grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['pima_log_loss.m']"
      ]
     },
     "execution_count": 90,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#保存负log损失的分类器模型\n",
    "from sklearn.externals import joblib\n",
    "joblib.dump(grid.best_estimator_,\"pima_log_loss.m\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['pima_accuracy.m']"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "penaltys = ['l1','l2']\n",
    "Cs = [0.001,0.1,1,10,100,1000]\n",
    "parameters = dict(penalty = penaltys,C = Cs)\n",
    "lr_penalty = LogisticRegression(solver = 'liblinear')\n",
    "grid = GridSearchCV(lr_penalty,parameters,cv=5,scoring='accuracy',return_train_score=True)\n",
    "grid.fit(X_train,y_train)\n",
    "#保存accuracy损失的分类器模型\n",
    "from sklearn.externals import joblib\n",
    "joblib.dump(grid.best_estimator_,\"pima_accuracy.m\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7631016042780748\n",
      "{'C': 1, 'penalty': 'l1'}\n"
     ]
    }
   ],
   "source": [
    "print(grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\ANACONDA3\\lib\\site-packages\\sklearn\\metrics\\_classification.py:1268: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, msg_start, len(result))\n",
      "D:\\ANACONDA3\\lib\\site-packages\\sklearn\\metrics\\_classification.py:1268: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, msg_start, len(result))\n",
      "D:\\ANACONDA3\\lib\\site-packages\\sklearn\\metrics\\_classification.py:1268: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, msg_start, len(result))\n",
      "D:\\ANACONDA3\\lib\\site-packages\\sklearn\\metrics\\_classification.py:1268: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, msg_start, len(result))\n",
      "D:\\ANACONDA3\\lib\\site-packages\\sklearn\\metrics\\_classification.py:1268: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, msg_start, len(result))\n",
      "D:\\ANACONDA3\\lib\\site-packages\\sklearn\\metrics\\_classification.py:1268: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, msg_start, len(result))\n",
      "D:\\ANACONDA3\\lib\\site-packages\\sklearn\\metrics\\_classification.py:1268: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, msg_start, len(result))\n",
      "D:\\ANACONDA3\\lib\\site-packages\\sklearn\\metrics\\_classification.py:1268: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, msg_start, len(result))\n",
      "D:\\ANACONDA3\\lib\\site-packages\\sklearn\\metrics\\_classification.py:1268: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, msg_start, len(result))\n",
      "D:\\ANACONDA3\\lib\\site-packages\\sklearn\\metrics\\_classification.py:1268: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, msg_start, len(result))\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7059351114002277\n",
      "{'C': 1, 'penalty': 'l1'}\n"
     ]
    }
   ],
   "source": [
    "#求precision为ROC曲线做准备\n",
    "penaltys = ['l1','l2']\n",
    "Cs = [0.001,0.1,1,10,100,1000]\n",
    "parameters = dict(penalty = penaltys,C = Cs)\n",
    "lr_penalty = LogisticRegression(solver = 'liblinear')\n",
    "grid = GridSearchCV(lr_penalty,parameters,cv=5,scoring='precision',return_train_score=True)\n",
    "grid.fit(X_train,y_train)\n",
    "print(grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['pima_precision.m']"
      ]
     },
     "execution_count": 94,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#保存precision的分类器模型\n",
    "from sklearn.externals import joblib\n",
    "joblib.dump(grid.best_estimator_,\"pima_precision.m\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(192, 10)\n"
     ]
    }
   ],
   "source": [
    "#对全体数据，随机选择其中25%做训练数据，剩下75%为测试数据，得到LogisticRegressionCV的accuracy对应的ROC/AUC,PR\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train,X_test,y_train,y_test = train_test_split(X_train, y_train, test_size=0.75, random_state=42)\n",
    "print(X_train.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.externals import joblib\n",
    "lr_best1 = joblib.load(\"pima_precision.m\")\n",
    "lr_best2 = joblib.load(\"pima_accuracy.m\")\n",
    "y_test_pred1 = lr_best1.predict_proba(X_test)\n",
    "y_test_pred2 = lr_best2.predict_proba(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(576, 2)"
      ]
     },
     "execution_count": 97,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_test_pred1.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0.83036951 0.16963049]\n",
      " [0.81822994 0.18177006]\n",
      " [0.86817158 0.13182842]\n",
      " ...\n",
      " [0.94362088 0.05637912]\n",
      " [0.83893735 0.16106265]\n",
      " [0.94592593 0.05407407]]\n"
     ]
    }
   ],
   "source": [
    "print(y_test_pred1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "None None\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#ROC/AUC,评价指标accuracy和precision对比，好像结果一样\n",
    "from sklearn.metrics import roc_curve,auc,precision_recall_curve,average_precision_score\n",
    "def plot_ROC_precision(model,X_test,y_test):\n",
    "    fpr,tpr,thresholds =roc_curve(y_test,y_test_pred1[:,1]) #roc_curve(y_true, y_score, pos_label=None, sample_weight=None, drop_intermediate=True)\n",
    "    roc_auc = auc(fpr,tpr)\n",
    "    ax1 = plt.subplot(121)\n",
    "    #verticalalignment设置水平对齐方式 ，可选参数 ： 'center' , 'top' , 'bottom' ,'baseline' \n",
    "    #horizontalalignment设置垂直对齐方式，可选参数：left,right,center\n",
    "    ax1.set_title('ROC',verticalalignment='top')\n",
    "    plt.fill_between(fpr,tpr,alpha=0.5,color='g')\n",
    "    plt.plot(fpr,tpr,'b',label='ROC=%0.4f'%roc_auc)\n",
    "    plt.legend()\n",
    "    plt.plot([0,1],[0,1],'r--')#从（0,0）画到（1,1），用红色虚线\n",
    "    plt.xlim([0.0,1.0])\n",
    "    plt.ylim([0.0,1.0])\n",
    "    plt.ylabel('tpr',fontsize = 15)\n",
    "    plt.xlabel('fpr',fontsize = 15)\n",
    "def plot_ROC_accuracy(model,X_test,y_test):\n",
    "    fpr,tpr,thresholds =roc_curve(y_test,y_test_pred2[:,1])\n",
    "    roc_auc = auc(fpr,tpr)\n",
    "    ax1 = plt.subplot(122)\n",
    "    ax1.set_title('ROC',verticalalignment='top')\n",
    "    plt.fill_between(fpr,tpr,alpha=0.5,color='g')\n",
    "    plt.plot(fpr,tpr,'b',label='ROC=%0.4f'%roc_auc)\n",
    "    plt.legend()\n",
    "    plt.plot([0,1],[0,1],'r--')\n",
    "    plt.xlim([0.0,1.0])\n",
    "    plt.ylim([0.0,1.0])\n",
    "    plt.ylabel('tpr',fontsize = 15)\n",
    "    plt.xlabel('fpr',fontsize = 15)\n",
    "print(plot_ROC_precision(lr_best1,X_test,y_test),plot_ROC_accuracy(lr_best2,X_test,y_test))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.6241758241758242\n",
      "{'C': 0.001, 'penalty': 'l2'}\n"
     ]
    }
   ],
   "source": [
    "#求recall为AP曲线做准备\n",
    "penaltys = ['l1','l2']\n",
    "Cs = [0.001,0.1,1,10,100,1000]\n",
    "parameters = dict(penalty = penaltys,C = Cs)\n",
    "lr_penalty = LogisticRegression(solver = 'liblinear')\n",
    "grid = GridSearchCV(lr_penalty,parameters,cv=5,scoring='recall',return_train_score=True)\n",
    "grid.fit(X_train,y_train)\n",
    "print(grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [],
   "source": [
    "#保存recall得分的分类器模型,并读入\n",
    "joblib.dump(grid.best_estimator_,\"pima_recall.m\")\n",
    "lr_best3 = joblib.load(\"pima_recall.m\")\n",
    "y_test_pred3 = lr_best3.predict_proba(X_test)\n",
    "lr_best2 = joblib.load(\"pima_accuracy.m\")\n",
    "y_test_pred2 = lr_best2.predict_proba(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "None None\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#对比accuracy和recall和在AP 曲线上的表现，accuracy好于recall\n",
    "def plot_PR_accuracy(model,X_test,y_test):\n",
    "    precision,recall,thresholds = precision_recall_curve(y_test,y_test_pred2[:,1])\n",
    "    AP = average_precision_score(y_test,y_test_pred2[:,1])\n",
    "    ax2 = plt.subplot(121)\n",
    "    ax2.set_title('PR curve AP=%0.2f'%AP,verticalalignment='center')\n",
    "    plt.step(recall,precision,alpha=1,color='r')#步阶图\n",
    "    plt.fill_between(recall,precision,alpha=0.5,color='g')# 填充两个函数之间的区域\n",
    "    plt.xlim([0.0, 1.0])\n",
    "    plt.ylim([0.0, 1.0])\n",
    "    plt.ylabel('precision',fontsize = 15)\n",
    "    plt.xlabel('recall',fontsize = 15)\n",
    "def plot_PR_recall(model,X_test,y_test):\n",
    "    precision,recall,thresholds = precision_recall_curve(y_test,y_test_pred3[:,1])\n",
    "    AP = average_precision_score(y_test,y_test_pred3[:,1])\n",
    "    ax2 = plt.subplot(122)\n",
    "    ax2.set_title('PR curve AP=%0.2f'%AP,verticalalignment='center')\n",
    "    plt.step(recall,precision,alpha=1,color='r')#步阶图\n",
    "    plt.fill_between(recall,precision,alpha=0.5,color='g')# 填充两个函数之间的区域\n",
    "    plt.xlim([0.0, 1.0])\n",
    "    plt.ylim([0.0, 1.0])\n",
    "    plt.ylabel('precision',fontsize = 15)\n",
    "    plt.xlabel('recall',fontsize = 15)\n",
    "print(plot_PR_accuracy(lr_best2,X_test,y_test),plot_PR_recall(lr_best3,X_test,y_test))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
